replace drone PR appimage setup with GitHub Actions
authorJyrki Gadinger <nilsding@nilsding.org>
Thu, 23 Jan 2025 13:55:36 +0000 (14:55 +0100)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 24 Jan 2025 08:08:02 +0000 (09:08 +0100)
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
.drone.yml
.github/workflows/linux-appimage.yml
admin/linux/build-appimage.sh
admin/linux/upload-appimage.sh [deleted file]

index d538bdc02845e25aad1aef1cd727396674195370..91f14af595e235a6578a6dce152286db0eefc74a 100644 (file)
@@ -148,28 +148,6 @@ trigger:
 
 ---
 kind: pipeline
-name: AppImage
-
-steps:
-- name: build
-  image: ghcr.io/nextcloud/continuous-integration-client-appimage-qt6:client-appimage-6.7.3-1
-  environment:
-    CI_UPLOAD_GIT_TOKEN:
-      from_secret: CI_UPLOAD_GIT_TOKEN
-    CI_UPLOAD_GIT_USERNAME:
-      from_secret: CI_UPLOAD_GIT_USERNAME
-  commands:
-    - BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE EXECUTABLE_NAME=nextcloud QT_BASE_DIR=/opt/qt6.7.3 OPENSSL_ROOT_DIR=/usr/local/lib64  /bin/bash -c "./admin/linux/build-appimage.sh"
-    - BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step."
-trigger:
-  branch:
-    - master
-    - stable-*
-  event:
-    - pull_request
-    - push
----
-kind: pipeline
 name: Debian
 
 steps:
index 5bcb172c425eebd7bf76908d8d34cc201f8d3472..a5f1aef032e03b31b321f0218375fe0d61f2cd18 100644 (file)
@@ -11,7 +11,61 @@ jobs:
       - uses: actions/checkout@v4
         with:
           fetch-depth: 1
+
       - name: Configure, compile and package
+        id: build-appimage
+        env:
+          PR_ID: ${{ github.event.number }}
         run: |
             BUILDNR=${GITHUB_RUN_ID} VERSION_SUFFIX=${GITHUB_HEAD_REF} BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=`pwd` EXECUTABLE_NAME=nextcloud QT_BASE_DIR=/opt/qt OPENSSL_ROOT_DIR=/usr/local/lib64  /bin/bash -c "./admin/linux/build-appimage.sh"
-            BUILDNR=${GITHUB_RUN_ID} VERSION_SUFFIX=${GITHUB_HEAD_REF} DESKTOP_CLIENT_ROOT=`pwd` /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step."
+
+      - name: Upload AppImage artifact
+        id: upload-appimage
+        uses: actions/upload-artifact@v4
+        with:
+          name: appimage-pr-${{ github.event.number }}
+          path: ${{ steps.build-appimage.outputs.APPIMAGE_NAME }}
+          overwrite: true
+
+      - name: Comment AppImage
+        uses: actions/github-script@v7
+        with:
+          script: |
+            const comment_identifier_string = "<!-- automated comment for an appimage build -->";
+
+            const comment_body = `
+              ${comment_identifier_string}
+
+              AppImage file: [${{ steps.build-appimage.outputs.APPIMAGE_NAME }}](${{ steps.upload-appimage.outputs.artifact-url }})
+
+              To test this change/fix you can simply download above AppImage file and test it.
+
+              Please make sure to quit your existing Nextcloud app and backup your data.
+            `;
+
+            console.log("fetching old comments")
+            const comments = await github.rest.issues.listComments({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: context.issue.number,
+            });
+
+            comments
+              .data
+              .filter(comment => comment.body?.includes(comment_identifier_string))
+              .forEach(comment => {
+                console.log(`deleting previous AppImage comment with ID ${comment.id}`)
+                github.rest.issues.deleteComment({
+                  owner: context.repo.owner,
+                  repo: context.repo.repo,
+                  comment_id: comment.id,
+                })
+              });
+
+            console.log("creating new comment")
+            github.rest.issues.createComment({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: context.issue.number,
+              body: comment_body,
+            });
index 3619e3d829b365d304cc8eebdcd5c59661d526a7..61b1b6f67e3e022ea3014886e4f1e1e0bb1aa683 100755 (executable)
@@ -12,7 +12,7 @@ export OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR:-/usr/lib/x86_64-linux-gnu}
 export VERSION_SUFFIX=${VERSION_SUFFIX:stable}
 
 # Set defaults
-export SUFFIX=${DRONE_PULL_REQUEST:=master}
+export SUFFIX=${PR_ID:=${DRONE_PULL_REQUEST:=master}}
 if [ $SUFFIX != "master" ]; then
     SUFFIX="PR-$SUFFIX"
 fi
@@ -111,10 +111,17 @@ rm ./squashfs-root/usr/lib/libglib-2.0.so.0
 LD_LIBRARY_PATH="$PWD/appimagetool-squashfs-root/usr/lib":$LD_LIBRARY_PATH PATH="$PWD/appimagetool-squashfs-root/usr/bin":$PATH appimagetool -n ./squashfs-root "${APPIMAGE}"
 
 #move AppImage
-if [ ! -z "$DRONE_COMMIT" ]
+export COMMIT=${GITHUB_SHA:=${DRONE_COMMIT}}
+if [ ! -z "$COMMIT" ]
 then
-    mv *.AppImage ${EXECUTABLE_NAME}-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage
+    export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-${COMMIT}-x86_64.AppImage"
 else
-    mv *.AppImage ${EXECUTABLE_NAME}-${SUFFIX}-x86_64.AppImage
+    export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-x86_64.AppImage"
+fi
+mv *.AppImage ${DESKTOP_CLIENT_ROOT}/$APPIMAGE_NAME
+
+# tell GitHub Actions the name of our appimage
+if [ ! -z "$GITHUB_OUTPUT" ]; then
+  echo "AppImage name: ${APPIMAGE_NAME}"
+  echo "APPIMAGE_NAME=${APPIMAGE_NAME}" >> "$GITHUB_OUTPUT"
 fi
-mv *.AppImage ${DESKTOP_CLIENT_ROOT}/
diff --git a/admin/linux/upload-appimage.sh b/admin/linux/upload-appimage.sh
deleted file mode 100755 (executable)
index 87f2a6c..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-#! /bin/bash
-
-# Env
-export BUILD=${DRONE_BUILD_NUMBER}
-export PR=${DRONE_PULL_REQUEST}
-export GIT_USERNAME=${CI_UPLOAD_GIT_USERNAME}
-export GIT_TOKEN=${CI_UPLOAD_GIT_TOKEN}
-
-# Needed to get it working on drone
-export SUFFIX=${DRONE_PULL_REQUEST:=master}
-if [ $SUFFIX != "master" ]; then
-    SUFFIX="PR-$SUFFIX"
-fi
-export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user}
-export APPNAME=${APPNAME:-nextcloud}
-
-# Defaults
-export GIT_REPO=ci-builds
-export API_BASE_URL=https://api.github.com/repos/$GIT_USERNAME/$GIT_REPO
-export DESKTOP_API_BASE_URL=https://api.github.com/repos/nextcloud/desktop
-
-# PR / master
-export TAG_NAME=${PR:=master}
-export RELEASE_BODY=https://github.com/nextcloud/desktop
-
-if [ $TAG_NAME != "master" ]; then
-    TAG_NAME="PR-$TAG_NAME"
-    RELEASE_BODY="nextcloud/desktop#$PR"
-fi
-
-cd ${DESKTOP_CLIENT_ROOT}
-echo `pwd`
-ls
-
-# AppImage
-if [ ! -z "$DRONE_COMMIT" ]
-then
-    export APPIMAGE=$(readlink -f ./${APPNAME}-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage)
-else
-    export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage)
-fi
-
-export UPDATE=$(readlink -f ./Nextcloud*.AppImage.zsync)
-export BASENAME=$(basename ${APPIMAGE})
-
-if ! test -e $APPIMAGE ; then
-    exit 1
-fi
-
-echo "Found AppImage: $BASENAME"
-
-if [ $TAG_NAME != "master" ]; then
-    # Delete all old comments in desktop PR, starting with "AppImage file:"
-    oldComments=$(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $DESKTOP_API_BASE_URL/issues/$PR/comments | jq '.[] | (.id |tostring) + "|" + (.user.login | test("'${GIT_USERNAME}'") | tostring) + "|" + (.body | test("AppImage file:.*") | tostring)'  | grep "true|true" | tr -d "\"" | cut -f1 -d"|")
-
-    if [[ "$oldComments" != "" ]]; then
-        echo $oldComments | while read comment ; do
-            curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $DESKTOP_API_BASE_URL/issues/comments/$comment
-        done
-    fi
-fi
-
-# Helper functions
-urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
-
-create_release()
-{
-    name=$TAG_NAME
-    body=$RELEASE_BODY
-    tagName=$TAG_NAME
-    echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $API_BASE_URL/releases -d "{ \"tag_name\": \"$tagName\", \"target_commitish\": \"master\", \"name\": \"$name\", \"body\": \"$body\", \"draft\": false, \"prerelease\": true }")
-}
-
-get_release()
-{
-    tagName=$TAG_NAME
-    echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/tags/$tagName)
-}
-
-get_release_assets()
-{
-    releaseId=$1
-    echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/$releaseId/assets)
-}
-
-upload_release_asset()
-{
-    uploadUrl=$1
-    echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE)
-    echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $UPDATE)
-}
-
-delete_release_asset()
-{
-    assetId=$1
-    curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $API_BASE_URL/releases/assets/$assetId
-}
-
-# Try to get an already existing release
-json=$(get_release)
-
-releaseId=$(echo $json | jq -r '.id')
-uploadUrl=$(echo $json | jq -r '.upload_url')
-
-if [[ "$uploadUrl" == "null" ]]; then
-    # Try to create a release
-    json=$(create_release)
-    echo $json
-
-    releaseId=$(echo $json | jq -r '.id')
-    uploadUrl=$(echo $json | jq -r '.upload_url')
-
-    if [[ "$uploadUrl" == "null" ]]; then
-        echo "create_release failed: $json"
-        exit 2
-    fi
-fi
-
-# Prepare upload url
-uploadUrl=$(echo "${uploadUrl/'{?name,label}'/?name=$BASENAME}")
-
-# Try to delete existing AppImage assets for this PR
-assets=$(get_release_assets $releaseId)
-
-for data in $(echo $assets | jq -r '.[] | @uri'); do
-    json=$(urldecode "$data")
-
-    assetId=$(echo $json | jq -r '.id')
-    name=$(echo $json | jq -r '.name')
-
-    if [[ "$name" == *.AppImage ]]; then
-        echo "Deleting old asset: $name"
-        $(delete_release_asset $assetId)
-    fi
-done
-
-# Upload release asset
-echo "Uploading new asset: $BASENAME"
-
-json=$(upload_release_asset "$uploadUrl")
-browserDownloadUrl=$(echo $json | jq -r '.browser_download_url')
-
-if [[ "$browserDownloadUrl" == "null" ]]; then
-    echo "upload_release_asset failed: $json"
-    exit 3
-fi
-
-if [ $TAG_NAME != "master" ]; then
-    # Create comment in desktop PR
-    curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $DESKTOP_API_BASE_URL/issues/$PR/comments -d "{ \"body\" : \"AppImage file: [$BASENAME]($browserDownloadUrl) <br/><br/>To test this change/fix you can simply download above AppImage file and test it. <br/><br/>Please make sure to quit your existing Nextcloud app and backup your data. \" }"
-fi
-
-echo
-echo "AppImage link: $browserDownloadUrl"